from django.http import JsonResponse
import requests, json, hashlib, time
from django.db import connection
import redis
from datetime import datetime, timedelta
# 从项目根目录中引入配置文件
from config import *

# 连接redis
cache = redis.Redis()

def can_request(client_identifier):
    # 使用客户端标识（如IP地址、用户ID等）作为键
    current_time = datetime.now().isoformat()
    key = f'client_request:{client_identifier}'
    # 检查缓存中是否存在该客户端的最后请求时间
    last_request_time = cache.get(key)
    if last_request_time:
        # 将获取的时间由字节串转换为字符串
        last_request_time = last_request_time.decode('utf-8')
        # 如果存在，检查是否已经超过60秒
        if (datetime.fromisoformat(str(current_time)) - datetime.fromisoformat(str(last_request_time))) < timedelta(seconds=60):
            return False  # 请求太频繁，不允许请求
    # 更新缓存中的最后请求时间为当前时间，并设置过期时间为60秒
    cache.setex(key, 60, current_time)
    return True

# 定义发送验证码的URL
url = "http://quickgame.sdk.quicksdk.net/webOpen/sendCodeByPhone"
# 定义登录接口的URL
login_url = "http://quickgame.sdk.quicksdk.net/webOpen/loginByPhone"
openId = 'mTtcPf'
open_key = 'oiigBDGzYeo4qebzhE2OgTPq6ckzo9PM'
productCode = '66087386127445193009048099903729'
def index(request):
    # 获取客户端IP地址
    ip = request.META.get('REMOTE_ADDR')
    print(ip)
    if can_request(ip):
        requests.get('http://www.baidu.com')
        return JsonResponse({'code': 200, 'msg': 'ok'})
    else:
        return JsonResponse({'code': 400, 'msg': '请求太频繁'})

# 签名算法示例，生成签名
def generate_sign(params, open_key):
    sorted_params = sorted(params.items())  # 将参数按key排序
    sign_string = "&".join([f"{key}={value}" for key, value in sorted_params]) + '&' + open_key
    print("签名串：", sign_string)
    md5_string = hashlib.md5(sign_string.encode("utf-8")).hexdigest()
    print("MD5签名：", md5_string)
    return hashlib.md5(sign_string.encode("utf-8")).hexdigest()
# 发送验证码接口
def send_code(request):
    print('方法:', request.method)
    print('请求内容:', request.content_type)
    print('请求数据:', request.body)
    # 如果是POST请求，并且请求内容为JSON格式，则获取请求数据
    if request.method == 'POST' and request.content_type == 'application/json':
        # 获取请求数据
        data = json.loads(request.body)
        # 获取请求数据中的手机号
        phone = data.get('phone')
        # 获取请求数据中的验证码
        code = data.get('code')
        # 定义请求的参数
        params = {
            "openId": openId,
            "productCode": productCode,
            "channelCode": "website",  # 可选参数
            "phone": phone,
            "sendType": 1,  # 验证类型，例如1为手机验证登录
        }
        # 假设你已经有了open_key
        # open_key = "oiigBDGzYeo4qebzhE2OgTPq6ckzo9PM"
        params['sign'] = generate_sign(params, open_key)

        # 判断发送频率
        if not can_request(phone):
            return JsonResponse({
                'status': 400,
                'message': '请求太频繁',
                'data': { 'message': '请求太频繁' }
            })
        # 发送POST请求,获取响应的
        response = requests.post(url, data=params)
        # 检查响应
        if response.status_code == 200:
            result = response.json()  # 解析响应JSON
            print('响应结果：', result)
            if result.get('status'):  # 检查响应状态码
                print("短信验证码发送成功")
                # 这里可以添加发送成功之后的逻辑
                # 响应JSON
                return JsonResponse({
                    'status': 200,
                    'message': '验证码发送成功',
                    'data': result
                })
            else:
                print(f"短信验证码发送失败，错误信息：{result.get('message')}")
                return JsonResponse({
                    'status': 400,
                    'message': '验证码发送失败',
                    'data': result
                })
# 登录接口
def login(request):
    # 如果是POST请求，并且请求内容为JSON格式，则获取请求数据
    if request.method == 'POST' and request.content_type == 'application/json':
        # 获取请求数据
        data = json.loads(request.body)
        # 获取请求数据中的手机号
        phone = data.get('phone')
        # 获取请求数据中的验证码
        code = data.get('code')
        url = "http://quickgame.sdk.quicksdk.net/webOpen/loginByPhone"

        # 定义请求的参数
        params = {
            "openId": "mTtcPf",
            "productCode": "66087386127445193009048099903729",
            "channelCode": "website",  # 可选参数
            "phone": phone,
            "code": code,
            # "sign": ""  # 签名串，需要按照QuickSDK的签名算法生成
        }
        # 假设你已经有了open_key
        open_key = "oiigBDGzYeo4qebzhE2OgTPq6ckzo9PM"
        params['sign'] = generate_sign(params, open_key)
        # 发送POST请求
        response = requests.post(url, data=params)
        # 检查响应
        if response.status_code == 200:
            # 解析返回的JSON数据
            result = response.json()
            print('响应结果：', result)
            if result.get('status'):
                print("登录成功")
                # 登录成功后的逻辑处理
                return JsonResponse({
                    'status': 200,
                    'message': '登录成功',
                    'data': result
                })
            else:
                print(f"登录失败，错误信息：{result.get('message')}")
                return JsonResponse({
                    'status': 400,
                    'message': '登录失败',
                    'data': result
                })
# 获取商品列表
def product_list(request):
    if request.method == 'GET':
        try:
            with connection.cursor() as cursor:
                cursor.execute("SELECT * FROM sam_product")
                # 查询数据，将每条数据转换为字典
                rows = [dict(zip([col[0] for col in cursor.description], row)) for row in cursor.fetchall()]
                # rows = cursor.fetchall()
                print('查询结果：', rows)
                return JsonResponse({
                    'status': 200,
                    'message': '获取商品列表成功',
                    'data': rows
                })
        except Exception as e:
            print(e)
            return JsonResponse({
                'status': 400,
                'message': '获取商品列表失败',
                'data': e
            })
# 获取角色
def role_list(request):
    if request.method == 'POST':
        url = "http://47.99.57.205:28976/userinfo"
        # 定义请求的参数
        params = {
            "openId": "mTtcPf",
            "productCode": "66087386127445193009048099903729",
        }
        # 假设你已经有了open_key
        open_key = "oiigBDGzYeo4qebzhE2OgTPq6ckzo9PM"
        params['sign'] = generate_sign(params, open_key)
        # 发送POST请求
        response = requests.post(url, data=params)
        print('响应结果：', response.json())
        return JsonResponse({
            'status': 200,
            'message': '获取角色',
            'data': response.json()
        })